﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using ObjModel = System.Collections.ObjectModel;
using System.Windows.Threading;

namespace OrgStructure
{

    public partial class App : Application
    {

        #region Members

        public static bool _IsLoading = false;
        public static bool IsLoading { get; set; }
        public static DispatcherTimer _timer = new DispatcherTimer();
        public static List<MyNode> _list = new List<MyNode>();
        public static ObjModel::ObservableCollection<Topic> Topics =
            new ObjModel::ObservableCollection<Topic>();
        public static Topic CurSelNode = null;
        public static List<SPUser> _SPUSersList = new List<SPUser>();
        public static List<SPUser> _SPUSersList_Active = new List<SPUser>();
        public static List<ADUser> _ADUSersList = new List<ADUser>();
        public static MainPage _mainpage;

        #endregion

        public App()
        {
            this.Startup += this.Application_Startup;
            this.Exit += this.Application_Exit;
            this.UnhandledException += this.Application_UnhandledException;

            InitializeComponent();
        }

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            _mainpage = new MainPage();
            this.RootVisual = _mainpage;
        }

        private void Application_Exit(object sender, EventArgs e)
        {

        }

        private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
        {
            // Если приложение выполняется вне отладчика, воспользуйтесь для сообщения об исключении
            // механизмом исключений браузера. В IE исключение будет отображаться в виде желтого значка оповещения 
            // в строке состояния, а в Firefox - в виде ошибки сценария.
            if (!System.Diagnostics.Debugger.IsAttached)
            {

                // ПРИМЕЧАНИЕ. Это позволит приложению выполняться после того, как исключение было выдано,
                // но не было обработано. 
                // Для рабочих приложений такую обработку ошибок следует заменить на код, 
                // оповещающий веб-сайт об ошибке и останавливающий работу приложения.
                e.Handled = true;
                Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
            }
        }

        private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
        {
            try
            {
                string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
                errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");

                System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
            }
            catch (Exception)
            {
            }
        }

    }

    #region Common structs

    public class MyNode
    {
        public int Id { get; set; }
        public int IdParent { get; set; }
        public string Name { get; set; }
    }

    public class Topic
    {
        public string Title { get; set; }
        public Guid Id { get; set; }
        public int IdI { get; set; }
        public int IdParent { get; set; }
        public ObjModel::ObservableCollection<Topic> ChildTopics { get; set; }
        public Topic()
        {
            ChildTopics = new ObjModel::ObservableCollection<Topic>();
        }
        public Topic(string title, Guid idValue)
            : this()
        {
            Title = title;
            Id = idValue;
            IdI = -1;
            IdParent = -1;
        }
        public Topic(string title, int parIdI)
            : this()
        {
            Title = title;
            IdI = parIdI;
            IdParent = -1;
            Id = Guid.NewGuid();
        }
        public Topic(string title, int parIdI, int parIdParent)
            : this()
        {
            Title = title;
            IdI = parIdI;
            IdParent = parIdParent;
            Id = Guid.NewGuid();
        }
    }

    public struct SPUser
    {
        public string Имя { get; set; }
        public string Фамилия { get; set; }
        public string ФИО { get; set; }
        public string Отдел { get; set; }
        public string Офис { get; set; }
        public string Тел { get; set; }
        public string EMail { get; set; }
        public string Должность { get; set; }
        public string ImageUrl { get; set; }
        public string SiteUrl { get; set; }
        public Guid id { get; set; }
        public string AccountName { get; set; }
    }

    public struct ADUser
    {
        public string Login { get; set; }
        public string USERACCOUNTCONTROL { get; set; }
        public string UserName { get; set; }
        public string DisplayName { get; set; }
        public string EMailAddress { get; set; }
        public string Office { get; set; }
        public string SN { get; set; }
        public string GIVENNAME { get; set; }
        public string EXTENSIONATTRIBUTE3 { get; set; }
        public string PHYSICALDELIVERYOFFICENAME { get; set; }
        public string EXTENSIONATTRIBUTE4 { get; set; }
        public string TELEPHONENUMBER { get; set; }
        public string TITLE { get; set; }
        public string Department { get; set; }
        public string Company { get; set; }
        public string Manager { get; set; }
    }

    #endregion

}
